package com.example.understand_compose1.testcase_activity

import android.os.Bundle
import android.widget.ListView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.understand_compose1.R
import com.example.understand_compose1.databinding.ActivityFetListViewBinding
import com.example.understand_compose1.testcase_activity.adapter.MyAdapter

class FetListViewActivity : AppCompatActivity() {
    lateinit var binding: ActivityFetListViewBinding

    // TODO: 给ListView使用的资源
    private val titles = arrayOf("桌子", "苹果", "蛋糕", "线衣", "猕猴桃", "围巾")
    private val prices = arrayOf("1800", "10/kg", "300", "250", "10/kg", "200")

    // 6张图
    private val pics = arrayOf(
        R.mipmap.qq_icon, R.mipmap.qq_icon, R.mipmap.qq_icon,
        R.mipmap.qq_icon, R.mipmap.qq_icon, R.mipmap.qq_icon
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        binding = ActivityFetListViewBinding.inflate(layoutInflater)
        setContentView(binding.root)

        ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        // 初始化 ListView
        val listView = findViewById<ListView>(R.id.lv1)
        val adapter = MyAdapter(this, titles, prices, pics)
        listView.adapter = adapter

        // listview item 点击事件
        listView.setOnItemClickListener { parent, view, position, id ->
            Toast.makeText(
                this,
                "标题: " + titles[position] + " 价格: " + prices[position],
                Toast.LENGTH_SHORT
            ).show()
        }
        // listview item 长按事件
        listView.setOnItemLongClickListener { parent, view, position, id ->
            Toast.makeText(this, "长按事件: ${titles[position]}", Toast.LENGTH_SHORT).show()
            true
        }
    }
}


/*
 * 在 Kotlin 中，当你在 `FetListViewActivity` 类中声明 `titles` 变量时，它是这个类的成员变量，而不是 `MyAdapter` 类的成员变量。由于 `MyAdapter` 是一个独立的内部类，它默认情况下没有直接访问外部类 `FetListViewActivity` 成员变量的权限，除非这些变量被声明为 `open` 或者你提供了一个从 `FetListViewActivity` 到 `MyAdapter` 的显式引用。
 *
 * 为了让 `MyAdapter` 能够访问 `titles`（以及其他资源），你可以做以下几件事情之一：
 *
 * ### 1. 将 `MyAdapter` 作为 `FetListViewActivity` 的内部类，并传递必要的数据
 *
 * ```kotlin
 * class FetListViewActivity : AppCompatActivity() {
 *     // ... 省略其他代码 ...
 *
 *     class MyAdapter internal constructor(private val titles: Array<String>, private val prices: Array<String>, private val pics: Array<Int>) : BaseAdapter() {
 *         override fun getCount(): Int = titles.size
 *
 *         override fun getItem(position: Int): Any = titles[position]
 *
 *         override fun getItemId(position: Int): Long = position.toLong()
 *
 *         override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
 *             // 创建新的 View 或者重用 convertView
 *             // 设置数据到 View
 *             // 返回配置好的 View
 *         }
 *     }
 *
 *     override fun onCreate(savedInstanceState: Bundle?) {
 *         super.onCreate(savedInstanceState)
 *         // ... 省略其他代码 ...
 *
 *         val adapter = MyAdapter(titles, prices, pics)
 *         binding.listView.adapter = adapter
 *     }
 * }
 * ```
 *
 * ### 2. 将 `MyAdapter` 作为顶级类，并在 `FetListViewActivity` 中创建实例时传递数据
 *
 * 如果 `MyAdapter` 不需要访问 `FetListViewActivity` 的其他成员或者方法，你可以将它作为一个顶级类：
 *
 * ```kotlin
 * class MyAdapter(private val titles: Array<String>, private val prices: Array<String>, private val pics: Array<Int>) : BaseAdapter() {
 *     // ... 省略其他代码 ...
 * }
 *
 * class FetListViewActivity : AppCompatActivity() {
 *     // ... 省略其他代码 ...
 *
 *     override fun onCreate(savedInstanceState: Bundle?) {
 *         super.onCreate(savedInstanceState)
 *         // ... 省略其他代码 ...
 *
 *         val adapter = MyAdapter(titles, prices, pics)
 *         binding.listView.adapter = adapter
 *     }
 * }
 * ```
 *
 * 在这两种情况下，我们都通过构造函数将 `titles`、`prices` 和 `pics` 数组传递给 `MyAdapter`，这样 `MyAdapter` 就可以访问这些数据了。这是一个很好的实践，因为它遵循了数据封装的原则，并且使得 `MyAdapter` 更容易测试。
 *
 */

/*
在您提供的代码中，您尝试在 `AppCompatActivity` 实现 `BaseAdapter`，这不是一个好的设计实践。通常，您应该创建一个单独的 `Adapter` 类来处理列表项的视图。以下是如何修改您的代码以遵循更好的设计模式：

1. **创建一个新的 Adapter 类**：
   创建一个单独的文件，例如 `MyAdapter.kt`，并在其中实现 `BaseAdapter`。

2. **将数据传递给 Adapter**：
   通过构造函数将数据（`titles`、`prices`、`pics`）传递给 `MyAdapter`。

3. **使用正确的 `inflate` 方法**：
   使用 `LayoutInflater` 从 `Context` 充气视图。

以下是修改后的代码：

### MyAdapter.kt
```kotlin
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.example.understand_compose1.R

class MyAdapter(private val context: Context, private val titles: Array<String>, private val prices: Array<String>, private val pics: Array<Int>) : BaseAdapter() {

    override fun getCount(): Int {
        return titles.size
    }

    override fun getItem(position: Int): Any {
        return titles[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        // 1. 加载布局
        val view = LayoutInflater.from(context).inflate(R.layout.item_for_listview, parent, false)

        // 2. 获取控件
        val iv1 = view.findViewById<ImageView>(R.id.iv1)
        val tv1 = view.findViewById<TextView>(R.id.tv1) // 物品
        val tv2 = view.findViewById<TextView>(R.id.tv2) // 价格
        val tv3 = view.findViewById<TextView>(R.id.tv3) // 价格数字

        // 3. 设置数据
        iv1.setImageResource(pics[position])
        tv1.text = titles[position]
        tv3.text = prices[position]

        return view
    }
}
```

### FetListViewActivity.kt
```kotlin
import android.os.Bundle
import android.view.View
import android.view.ViewCompat
import android.view.WindowInsetsCompat
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowInsetsCompat

class FetListViewActivity : AppCompatActivity() {
    lateinit var binding: ActivityFetListViewBinding

    // TODO: 给ListView使用的资源
    private val titles = arrayOf("桌子", "苹果", "蛋糕", "线衣", "猕猴桃", "围巾")
    private val prices = arrayOf("1800", "10/kg", "300", "250", "10/kg", "200")
    // 6张图
    private val pics = arrayOf(
        R.mipmap.qq_icon, R.mipmap.qq_icon, R.mipmap.qq_icon,
        R.mipmap.qq_icon, R.mipmap.qq_icon, R.mipmap.qq_icon
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        binding = ActivityFetListViewBinding.inflate(layoutInflater)
        setContentView(binding.root)

        ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        // 初始化 ListView
        val listView = findViewById<ListView>(R.id.listView)
        val adapter = MyAdapter(this, titles, prices, pics)
        listView.adapter = adapter
    }
}
```

### 说明：
1. **MyAdapter.kt**：
   - 将 `MyAdapter` 作为一个单独的类实现，它接收 `Context`、`titles`、`prices` 和 `pics` 作为参数。
   - 使用 `LayoutInflater.from(context)` 来充气布局。

2. **FetListViewActivity.kt**：
   - 在 `onCreate` 方法中初始化 `ListView` 并设置适配器。
   - 使用 `findViewById` 来获取 `ListView` 实例，并将其传递给 `MyAdapter`。

这样，您的代码将更加模块化和易于维护。

 */